package abel.wlmr.model.type;

import java.util.HashMap;
import java.util.Map;

/**
 * B.4.3.3.2.6 功能码
 * 当启动标志位 PRM =1 时，功能码定义见表 B.2。
 * 表B.2 功能码定义（ PRM=1）
 * 功能码 帧类型 服务功能
 * 0 —— 备用
 * 1 发送⁄确认 复位命令
 * 2～3 —— 备用
 * 4 发送⁄无回答 用户数据
 * 5～8 —— 备用
 * 9 请求⁄响应帧 链路测试
 * 10 请求⁄响应帧 请求 1 级数据
 * 11 请求⁄响应帧 请求 2 级数据
 * 12～15 —— 备用
 * 
 * 本标准规定：
 * ——启动站功能码 10（请求 1 级数据）用于应用层请求确认（CON=1）的链路传输，应用层请求确
 * 认标志见本附录 B.4.3.4.3.4。
 * ——启动站功能码 11（请求 2 级数据）用于应用层请求数据的链路传输。
 * 
 * @author Abel
 *
 */
public enum AfnType {
    Verify(0),
    Reset(1, true),
    Heart(2),
    Set(4, true),
    Ctrl(5, true),
    Auth(6, true),
    Term(9),
    Query(0x0A),
    Task(0x0B),
    First(0x0C),
    Second(0x0D),
    Third(0x0E),
    File(0x0F, true),
    Forward(0x10, true),
    Reserved(255);

    private short value;

    /** Only valid for Down packets. */
    private boolean important;

    private static Map<Short, AfnType> enumList = new HashMap<>();
    static {
        for (AfnType b : AfnType.values()) {
            enumList.put(b.value, b);
        }
    }

    private AfnType(int v) {
        this(v, false);
    }

    private AfnType(int v, boolean important) {
        this.value = (short) v;
        this.important = important;
    }

    public static AfnType findEnumByValue(short v) {
        if (v < 0 || v > 255) {
            throw new IllegalArgumentException("afn should be [0,255] but " + v);
        }

        if (enumList.containsKey(v)) {
            return enumList.get(v);
        } else {
            Reserved.value = v;
            return Reserved;
        }
    }

    /**
     * @return the value
     */
    public short getValue() {
        return value;
    }

    /**
     * @return the important
     */
    public boolean isImportant() {
        return important;
    }

}
